#ifndef _BITREE_H_
#define _BITREE_H_

/****
 * 定义是左分支还是右分支的标识
 ****/
#define BiT_BRACH_L 0
#define BiT_BRACH_R 1

/****
 * 用结构体来定义二叉树中的指针域
 * 可以参照单链表的方式进行 二叉树的实现
 ****/
/**
 * 数据类型封装 
 **/
typedef void BiTree;
/**
 * 目标节点相对于根节点的位置信息 
 **/
typedef unsigned long long BiTNodePos;
/****
 * 节点的指针域
 * 单链表中一个指针，树中两个指针
 * 与单链表相比较，唯一的不同就是在指针域中有两个指针而已，也就是每个节点中，有两个指针而已
 ****/
typedef struct _tag_BiTreeNode
{
    struct _tag_BiTreeNode *lchild;
    struct _tag_BiTreeNode *rchild;
} BiTreeNode;
/****
 * 二叉树节点的结构的定义
 ****/
typedef struct _tag_BiTree
{
    BiTreeNode *root; /* 指向二叉树的根节点 */
    int count;        /* 二叉树中节点的个数 */
} TBiTree;

typedef void(BiTree_Printf)(BiTreeNode *);

typedef struct __tag_func_BiTree
{
    BiTree *(*create)();
    int (*insert)(BiTree *, BiTreeNode *, BiTNodePos, int);
    BiTreeNode *(*delete)(BiTree *, BiTNodePos, int);
    BiTreeNode *(*get)(BiTree *, BiTNodePos, int);
    int (*update)(BiTree *, BiTNodePos, int, BiTreeNode *);
    void (*display)(BiTree *, BiTree_Printf *, int);
    void (*clear)(BiTree *);
    int (*depth)(BiTree *);
    int (*count)(BiTree *);
    int (*degree)(BiTree *);
    BiTreeNode *(*reset)(BiTree *);
    void (*destroy)(BiTree *);
} TFBiTree;

#endif
